/**
 * 
 */
package br.edu.ufcg.msnlab2.misc;

import java.util.List;
import java.util.Map;

import mathExpr.ExpressionConfiguration;
import mfc.field.Complex;

/**
 * @author 
 *
 */
public interface Function {
	
	/**
	 * TODO
	 * @return
	 */
	public String getExpression();
	
	/**
	 * TODO
	 * @param value
	 * @return
	 */
	public double evaluate(double value);
	
	/**
	 * Method used to evaluate a function that contains multiple variables
	 * @param sampledPoints The set of sampled points that will be used to evaluate the function
	 * @param index The index of the point to be used in the current evaluation
	 * @return The value of the function in a fixed point
	 */
	public double evaluate(Map<String, List<Double>> sampledPoints, int index);
	
	/**
	 * TODO
	 * @param value
	 * @return
	 */
	public Complex evaluate(Complex value);
	
	/**
	 * TODO
	 * @param value
	 * @return
	 */
	public double evaluate(double x, double y);
	
	/**
	 * TODO
	 * @return
	 */
	public Function derivative();


	/**
	 * TODO
	 * @return
	 */
	public Function derivativeY();
	
	/**
	 * TODO
	 * @return
	 */
	public List<Point> getPoints();
	
	public void setPoints(List<Point> points);
	
	/**
	 * TODO
	 * @param min
	 * @param max
	 * @param step
	 * @return
	 */
	public List<Point> getPoints(double min, double max, double step);
	
	/**
	 * Returns the number of variables in the current function
	 * @return The number of variables
	 */
	public int getNumberOfVariables();

}
